-- Lua 脚本: 检查用户是否达到优惠券领取上限并记录领取次数（返回列表形式）

-- 参数列表：
-- KEYS[1]: 优惠券库存键 (coupon_stock_key)
-- KEYS[2]: 用户领取记录键 (user_coupon_count_key)
-- ARGV[1]: 优惠券有效期结束时间 (timestamp)
-- ARGV[2]: 用户领取上限 (limit)

-- 获取当前库存
local stock = tonumber(redis.call('HGET', KEYS[1], 'stock'))

-- 判断库存是否大于 0
if stock <= 0 then
    return {1, 0} -- 库存不足：状态1，次数0
end

-- 获取用户领取的优惠券次数
local userCouponCount = tonumber(redis.call('GET', KEYS[2]))

-- 如果用户领取次数不存在，则初始化为 0
if userCouponCount == nil then
    userCouponCount = 0
end

-- 判断用户是否已经达到领取上限
if userCouponCount >= tonumber(ARGV[2]) then
    return {2, userCouponCount} -- 达到上限：状态2，当前次数
end

-- 增加用户领取的优惠券次数
if userCouponCount == nil then
    -- 如果用户第一次领取，则需要添加过期时间
    redis.call('SET', KEYS[2], 1)
    redis.call('EXPIRE', KEYS[2], ARGV[1])
else
    -- 因为第一次领取已经设置了过期时间，第二次领取沿用之前即可
    redis.call('INCR', KEYS[2])
end

-- 减少优惠券库存
redis.call('HINCRBY', KEYS[1], 'stock', -1)

return {0, userCouponCount + 1} -- 领取成功：状态0，新次数